//手写eventEmit
class EventEmit{
    constructor(){
        //事件对象，里面存储订阅的事件名和事件
        this.event={};
    }
    event
    //订阅事件的方法
    on(eventName,callback){//前一个是事件名，后一个是事件名触发的方法
        if(!this.event[eventName]){ //若这个事件名没有注册，则进行注册
            this.event[eventName]=[callback]; //一个名字可以订阅多个事件函数
        }else{
            this.event[eventName].push(callback); //若已经有此事件名，则将事件处理函数push进数组尾部
        }
    }
    //事件触发的方法
    emit(eventName,...rest){//前面是事件名，后面是传给这个事件的参数
        if(this.event[eventName]){
            this.event[eventName].forEach(element => { //遍历这个eventName中所有订阅的事件，进行执行
                element.apply(this,rest);
            });
        }else{
            console.log("没有注册此方法");
            }
    }
    //取消订阅的事件，一个eventName可能对应多个事件，取消相应的事件
    remove(eventName,callback){
        if(this.event[eventName]){
            this.event[eventName] = this.event[eventName].filter(item=>{
                item!==callback;
            })//将相应的事件移出这个eventName对应的事件数组中
        }
    }
    //只执行一次订阅的事件，然后移除
    once(eventName,callback){
        let fn = ()=>{
            callback();//fn函数中调用原有的callback
            this.remove(eventName,fn)//删除fn，只会执行一次
        }
        this.on(eventName,fn);
    }
}
const e = new EventEmit();
const handler = (...rest)=>{
    console.log(rest);
}
e.emit('click',100)
e.on('click',handler);
e.emit('click',100,100,1000);
e.remove('click',handler);

e.once('dbclick',function(){
    console.log('dbclick');
})
e.emit('dbclick',100)